package com.glink.manage.service;

import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.glink.common.exception.GeneralSimpleException;
import com.glink.manage.domain.PersonAccessRelaBean;
import com.glink.manage.dto.person.PersonAccessCycleSaveDTO;
import com.glink.manage.dto.person.PersonAccessIdDTO;
import com.glink.manage.dto.person.PersonAccessPageDTO;
import com.glink.manage.vo.person.PersonAccessPageVO;
import com.glink.manage.vo.temporaryadmission.TemporaryAdmissionCheckWorkVO;

import java.util.List;
import java.util.Set;

/**
 * @author  qiushaoshan
 * @since  2025-01-16
 */
public interface PersonAccessRelaService extends IService<PersonAccessRelaBean> {

    /**
     * 分页查询准入
     *
     * @param dto 分页查询条件
     * @return 准入工程
     */
    IPage<PersonAccessPageVO> pageByAccess(PersonAccessPageDTO dto) throws GeneralSimpleException;

    /**
     * 删除准入工程
     * @param dto 删除条件 
     * @return 删除状态
     */
    Boolean delAccessWork(PersonAccessIdDTO dto);

    /**
     * 更新准入工程周期
     * @param dto 更新信息
     * @return 更新状态
     */
    Boolean updateAccessCycle(PersonAccessCycleSaveDTO dto) throws GeneralSimpleException;

    /**
     * 删除准入
     * @param constructionWorkObjId 工程
     * @param participatingUnitObjId 参建单位
     * @param nowDate 当前时间
     */
    boolean delAccessByWorkObjIdAndUnitObjIdAndCycleStartGt(String constructionWorkObjId, String participatingUnitObjId, String nowDate);

    /**
     * 更新准入
     * @param constructionWorkObjId 工程
     * @param participatingUnitObjId 参建单位
     * @param nowDate 当前时间
     */
    void updateAccessCycleEndByWorkObjIdAndUnitObjIdAndCycleStartGtAndCycleEndLt(String constructionWorkObjId, String participatingUnitObjId, String nowDate);

    /**
     * 根据工程ID查询未同步的人员ID
     * @param constructionWorkObjId 工程ID
     * @return 人员ID
     */
    Set<Integer> findPersonIdByWorkIdAndNotSync(String constructionWorkObjId);

    /**
     * 根据人员信息查询准入工程
     * @param personObjId 人员信息
     * @return 准入工程ID
     */
    List<String> findWorkIdByPersonId(String personObjId);

    /**
     * 查询人员准入记录
     * @param personIdList 人员ID
     * @param dateTime 时间
     * @return 准入信息
     */
    List<PersonAccessRelaBean> findAccessInfoByPersonIdInAndCycleEndGeAndWorkId(List<String> personIdList, DateTime dateTime, String workId);

    /**
     * 查询工程准入信息
     * @param personIdList 人员ID
     * @param constructionWorkObjId 工程
     * @return 准入信息
     */
    List<TemporaryAdmissionCheckWorkVO> findWorkAccessByPersonIdInAndConstructionWorkObjId(List<String> personIdList, String constructionWorkObjId);

    /**
     * 查询准入的工程ID
     * @param personId 人员ID
     * @param dateTime 当前时间
     * @return 工程ID
     */
    List<String> findWorkIdByPersonIdAndCycleStartGeAndCycleEndLe(String personId, DateTime dateTime);
}
